<?php
// +----------------------------------------------------------------------
// | sfadmin - Suifeng Administration
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://suifeng.tech All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: suifeng <1787585212@qq.com>
// +----------------------------------------------------------------------

namespace suifeng\builder\table;

use suifeng\helper\BaseObject;
use suifeng\helper\ClassHelper;
use suifeng\helper\HtmlHelper;

abstract class Column extends BaseObject
{
    /**
     * Table对象。
     *
     * @var unknown
     */
    public $table;

    /**
     * 名称。
     *
     * @var unknown
     */
    public $name;

    /**
     * 标题。
     *
     * @var unknown
     */
    public $title;

    /**
     * 输出方法。
     *
     * @var [type]
     */
    public $callback;

    /**
     * 表头属性数组。
     *
     * @var array
     */
    public $head_attributes = array();

    /**
     * 单元格属性数组。
     *
     * @var array
     */
    public $cell_attributes = array();

    /**
     * 构造方法。
     *
     * @param string $config
     */
    public function __construct($config = array())
    {
        parent::__construct($config);

        if (empty($this->title)) {
            $this->title = strtoupper(ClassHelper::short_name($this));
        }
    }

    /**
     * 输出标题。
     *
     * @return string
     */
    public function render_head()
    {
        return HtmlHelper::render_tag('th',
            $this->head_attributes,
            $this->_fetch_head_content());
    }

    /**
     * 输出单元格。
     *
     * @param unknown $row
     * @return unknown|string
     */
    public function render_cell($row)
    {
        $content = $this->_fetch_cell_content($row);

        // 如果有自定义的输出方法，则调用自定义方法输出。
        if ($this->callback) {
            $content = ClassHelper::invoke_callback($this->callback, [$row, $content]);
        }

        return HtmlHelper::render_tag('td', $this->cell_attributes, $content);
    }

    /**
     * 获取标题内容。
     *
     * @return \suifeng\table\columns\unknown
     */
    protected function _fetch_head_content()
    {
        return $this->title;
    }

    /**
     * 获取单元格内容。
     *
     * @param unknown $row
     * @return unknown|string
     */
    protected abstract function _fetch_cell_content($row);

    /**
     * 获取Key值。
     *
     * @param unknown $row
     * @return unknown|NULL
     */
    protected function _get_key_value($row)
    {
        if (!empty($this->table->key_field) && isset($row[$this->table->key_field])) {
            return $row[$this->table->key_field];
        } else {
            return null;
        }
    }



//     protected function _render_list_cell_content($row)
//     {
//         if (! isset($this->_list_cell_content_render_method)) {
//             $this->_list_cell_content_render_method = null;

//             if ($this->table->controller) {
//                 $method_name = __FUNCTION__;
//                 $ref_class = new \ReflectionClass($this->table->controller);
//                 if ($ref_class->hasMethod($method_name)) {
//                     $this->_list_cell_content_render_method = $ref_class->getMethod($method_name);
//                     $this->_list_cell_content_render_method->setAccessible(true);
//                 }
//             }
//         }

//         $content = $this->_fetch_cell_content($row);
//         if ($this->_list_cell_content_render_method) {
//             $content = $this->_list_cell_content_render_method->invoke($this->table->controller, $row, $this, $content);
//         }

//         return $content;
//     }

//     /**
//      * 工厂方法。
//      *
//      * @param unknown $type
//      * @param string $config
//      * @throws \Exception
//      * @return mixed
//      */
//     public static function create($type, $config = array())
//     {
//         if (is_array($type)) {
//             $config = $type;

//             if (isset($config['type'])) {
//                 $type = $config['type'];
//                 unset($config['type']);
//             } else if (isset($config['column'])) {
//                 $type = $config['column'];
//                 unset($config['column']);
//             } else {
//                 $type = 'text';
//             }
//         }

//         $class_name = '\\suifeng\\builder\\table\\column\\' . implode('', array_map('ucfirst', explode('_', $type)));
//         if (!class_exists($class_name)) {
//             throw new \Exception('Column type not exists: ' . $type);
//         }

//         return new $class_name($config);
//     }
}
